package com.baoyouqun.service;

import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baoyouqun.domain.CreateCmd.ReportRecordCreateCmd;
import com.baoyouqun.domain.Query.ReportRecordQuery;
import com.baoyouqun.domain.Query.ReportRecordQueryBack;
import com.baoyouqun.domain.UpdateCmd.ReportRecordUpdateCmd;
import com.baoyouqun.domain.VO.ReportRecordVO;
import com.baoyouqun.domain.VO.ReportWithDemandVO;
import com.baoyouqun.domain.cmd.BatchUpdateReportStatusCmd;
import com.baoyouqun.entity.ReportRecord;
import jakarta.servlet.http.HttpServletResponse;

import java.util.List;
import java.util.Map;

public interface ReportRecordService extends IService

        <ReportRecord> {

    /**
     * 新增并返回实体
     */
    SingleResponse<ReportRecordVO> create(ReportRecordCreateCmd cmd);

    Response update(ReportRecordUpdateCmd cmd);

    /**
     * 根据ID查询VO
     */
    ReportRecordVO selectById(String id);

    /**
     * 分页查询VO
     */
    IPage<ReportRecordVO> pageVo(ReportRecordQuery query);

    // ---------------------- 新增需求接口（对齐用户示例风格） ----------------------

    /**
     * 后台管理-举报记录分页查询（含帖子+举报人关联）
     *
     * @param query 筛选条件（含举报人姓名、举报类型等）
     * @return 分页VO结果
     */
    IPage<ReportWithDemandVO> pageAdminReportWithDemand(ReportRecordQueryBack query);

    /**
     * 后台管理-举报记录导出Excel（Hutool+POI，对齐用户导出逻辑）
     *
     * @param query    筛选条件（与分页共用）
     * @param response 响应流（输出Excel）
     */
    void exportAdminReportExcel(ReportRecordQueryBack query, HttpServletResponse response);

    /**
     * 批量设置违规（举报状态=已违规，帖子状态=下架）
     *
     * @param cmd 批量操作命令
     * @return 操作结果
     */
    Response batchSetViolation(BatchUpdateReportStatusCmd cmd);

    /**
     * 批量设置正常（举报状态=已驳回，帖子状态=正常）
     *
     * @param cmd 批量操作命令
     * @return 操作结果
     */
    Response batchSetNormal(BatchUpdateReportStatusCmd cmd);

    // ========================== 批量查询举报关联帖子（用于展开/收起） ==========================
    List<ReportWithDemandVO> listReportWithDemand(List<String> reportIds);

    Map<String, Integer> countValidReportsByUserIds(List<String> userIds);
}